package com.yuanheng100.ems4j.api;

import com.yuanheng100.ems4j.model.Ems4jDepartment;
import com.yuanheng100.ems4j.model.Ems4jDingTalk;
import com.yuanheng100.ems4j.model.Ems4jEmployee;
import com.yuanheng100.ems4j.model.Ems4jPage;

import java.util.List;
import java.util.Map;

/**
 * Created by jlqian on 2017/1/16.
 */
public interface IDingTalkService
{
    /**
     * 创建部门
     *
     * @param name            部门名称。长度限制为1~64个字符
     * @param parentId        父部门id。根部门id为1
     * @param order           在父部门中的次序值。order值小的排序靠前
     * @param createDeptGroup 是否创建一个关联此部门的企业群，默认为false
     * @return
     */
    Long createDepartment(String name, String parentId, Integer order, Boolean createDeptGroup);

    /**
     * 删除部门
     *
     * @param departmentId 部门id。（注：不能删除根部门；不能删除含有子部门、成员的部门）
     */
    void deleteDepartment(Long departmentId);

    /**
     * 更新部门信息
     *
     * @param name                  部门名称。长度限制为1~64个字符
     * @param departmentId          部门id
     * @param parentId              父部门id。根部门id为1
     * @param order                 在父部门中的次序值。order值小的排序靠前
     * @param createDeptGroup       是否创建一个关联此部门的企业群
     * @param autoAddUser           如果有新人加入部门是否会自动加入部门群
     * @param deptManagerUseridList 部门的主管列表,取值为由主管的userid组成的字符串，不同的userid使用’| 符号进行分割
     * @param deptHiding            是否隐藏部门, true表示隐藏, false表示显示
     * @param deptPerimits          可以查看指定隐藏部门的其他部门列表，如果部门隐藏，则此值生效，取值为其他的部门id组成的的字符串，使用 | 符号进行分割
     */
    void updateDepartment(String name, Long departmentId, Integer parentId, Integer order, Boolean createDeptGroup, Boolean autoAddUser, String deptManagerUseridList, Boolean deptHiding, String deptPerimits);

    /**
     * 获取部门下的所有子部门
     *
     * @param parentDeptId 父部门id
     * @return
     */
    List<Ems4jDepartment> listDepartments(String parentDeptId);

    Ems4jDepartment getDepartmentDetail(String deptId);

    /**
     * 创建成员
     *
     * @param userid      员工唯一标识ID（不可修改），企业内必须唯一。长度为1~64个字符，如果不传，服务器将自动生成一个userid
     * @param name        成员名称。长度为1~64个字符
     * @param email       邮箱。长度为0~64个字符。企业内必须唯一
     * @param mobile      手机号码。企业内必须唯一
     * @param departments 数组类型，数组里面值为整型，成员所属部门id列表
     */
    void createUser(String userid, String name, String email, String mobile, List<Long> departments);

    /**
     * 删除成员
     *
     * @param userid 员工唯一标识ID（不可修改）
     */
    void deleteUser(String userid);

    /**
     * 批量删除成员
     *
     * @param useridlist 员工UserID列表。列表长度在1到20之间
     */
    void batchDeleteUser(List<String> useridlist);

    /**
     * 修改成员信息
     *
     * @param userid     员工唯一标识ID（不可修改），企业内必须唯一。长度为1~64个字符
     * @param name       成员名称。长度为1~64个字符
     * @param department 成员所属部门id列表
     * @param email      邮箱。长度为0~64个字符。企业内必须唯一
     * @param mobile     手机号码。企业内必须唯一
     */
    void updateUser(String userid, String name, List<Long> department, String email, String mobile);

    /**
     * 获取成员
     *
     * @param userid 员工在企业内的UserID，企业用来唯一标识用户的字段。
     * @return
     */
    Ems4jEmployee getUser(String userid);

    /**
     * 获取部门成员
     *
     * @param departmentId 获取的部门id
     * @param offset       支持分页查询，与size参数同时设置时才生效，此参数代表偏移量
     * @param size         支持分页查询，与offset参数同时设置时才生效，此参数代表分页大小，最大100
     * @param order        支持分页查询，部门成员的排序规则，默认不传是按自定义排序；entry_asc代表按照进入部门的时间升序，entry_desc代表按照进入部门的时间降序，modify_asc代表按照部门信息修改时间升序，modify_desc代表按照部门信息修改时间降序，custom代表用户定义(未定义时按照拼音)排序
     * @return
     */
    List<Ems4jEmployee> getDepartmentUser(Long departmentId, Long offset, Integer size, Integer order);

    /**
     * 获取部门成员的详细信息
     *
     * @param departmentId 获取的部门id
     * @param offset       支持分页查询，与size参数同时设置时才生效，此参数代表偏移量
     * @param size         支持分页查询，与offset参数同时设置时才生效，此参数代表分页大小，最大100
     * @param order        支持分页查询，部门成员的排序规则，默认不传是按自定义排序；entry_asc代表按照进入部门的时间升序，entry_desc代表按照进入部门的时间降序，modify_asc代表按照部门信息修改时间升序，modify_desc代表按照部门信息修改时间降序，custom代表用户定义(未定义时按照拼音)排序
     * @return
     */
    List<Ems4jEmployee> getDepartmentUserDetails(Long departmentId, Long offset, Integer size, Integer order);

    /**
     * 发送企业会话消息【文本】
     *
     * @param toUsers   员工id列表（消息接收者，多个接收者用|分隔）
     * @param toParties 部门id列表，多个接收者用|分隔。touser或者toparty 二者有一个必填
     * @param agentId   企业应用id，这个值代表以哪个应用的名义发送消息
     * @param content   消息内容
     * @return
     */
    void sendTextMessage(String toUsers, String toParties, String agentId, String content);

    /**
     * 发送企业会话消息【文本】
     *
     * @param ems4jDingTalk 为设置发送人，重载sendTextMessage(String toUsers, String toParties, String agentId, String content)
     * @return
     */
    void sendTextMessage(Ems4jDingTalk ems4jDingTalk);

    /**
     * 发送企业会话消息【图片】
     *
     * @param toUsers   员工id列表（消息接收者，多个接收者用|分隔）
     * @param toParties 部门id列表，多个接收者用|分隔。touser或者toparty 二者有一个必填
     * @param agentId   企业应用id，这个值代表以哪个应用的名义发送消息
     * @param media_id  图片媒体文件id，可以调用上传媒体文件接口获取。建议宽600像素 x 400像素，宽高比3：2
     * @return
     */
    void sendImageMessage(String toUsers, String toParties, String agentId, String media_id);

    /**
     * 发送企业会话消息【图片】
     *
     * @param ems4jDingTalk 为设置发送人，重载sendImageMessage(String toUsers, String toParties, String agentId, String media_id)
     * @return
     */
    void sendImageMessage(Ems4jDingTalk ems4jDingTalk);

    /**
     * 根据查询条件，查找符合条件的结果，并进行分页
     *
     * @param page
     * @param conditions
     */
    void getPage(Ems4jPage<Ems4jDingTalk> page, Map<String, Object> conditions);

}
